package com.itheima.d0_generic;

import java.util.ArrayList;

//目标：了解泛型通配符的使用方式
public class Demo5 {
    public static void main(String[] args) {
        //需求：优化sellApple和sellBanana两个方法，变成一个批量销售所有水果的方法
        ArrayList<Apple> apples = new ArrayList<>();
        sellApple(apples);

        ArrayList<Banana> bananas = new ArrayList<>();
        sellBanana(bananas);

        //1.将两个方法合并成一个方法，要求：方法形参的ArrayList集合，既能接收ArrayList<Apple>，也能接收ArrayList<Banana>

        //2.尝试定义方法，形参为：ArrayList<Fruit> fruits，尝试一下
        //报错：sellFruit方法的形参是ArrayList集合类型！泛型检查这个集合只能存储Fruit，传入apples和bananas就会报错
        //sellFruit(apples);
        //sellFruit(bananas);

        //3.出现的问题：在让fruits变量接收数据时，ArrayList集合中泛型的类型不能确定！
        //所以导致ArrayList泛型类中E变量不知道该赋值什么类型！解决：就给E赋值通配符?
        //?：泛型通配符，代表不确定的类型

        sellFruit(apples);
        sellFruit(bananas);

        //4.?代表不确定的类型，也就是说所有类型都可以。除了水果，其他类型也可以
        ArrayList<Dog> dogs = new ArrayList<>();
//        sellFruit(dogs);

        //5.所以使用?时，有时还需要限制?的类型范围！用：上限或下限
        //现在：需要?代表的是Fruit类型或其子类类型，用上限 ? extends Fruit
    }

    //批量销售水果
    //public static void sellFruit(ArrayList<Fruit> fruits) {
//    public static void sellFruit(ArrayList<?> fruits) {
//
//    }
    public static void sellFruit(ArrayList<? extends Fruit> fruits) {
        System.out.println("销售水果！");
    }

    //批量销售苹果
    public static void sellApple(ArrayList<Apple> apples) {
        System.out.println("销售苹果");
    }

    //批量销售香蕉
    public static void sellBanana(ArrayList<Banana> bananas) {
        System.out.println("销售香蕉");
    }
}
